linux文件格式处理命令cut,grep,sed,awk:批量修改多文件中序列名

您所在的位置:网站首页 awk 替换某一列 linux文件格式处理命令cut,grep,sed,awk:批量修改多文件中序列名

linux文件格式处理命令cut,grep,sed,awk:批量修改多文件中序列名

2023-07-29 09:46| 来源: 网络整理| 查看: 265

要处理一份10多个G序列数据的序列名,据说直接的linux命令是最快的,回头来复习一下这几个命令吧。

什么是选取命令?

就是将一段数据经过分析后,取出我们想要的或者经由分析关键词,取出我们想要的那一行。通常选取信息是针对一行一行来分析的,并不是整篇分析。

**

1 cut

** cut命令可以将一段信息的某一段给它切出来,也就是将一行里面的数据进行分解,它是以行为单位处理数据的。

常用的有两种:

(1)对于有特定分隔字符的的文本,分隔后获取其第m‘区域’与n‘区域’的信息:

cut -d '分隔的字符' -f m,n filename

(2)对于排列整齐的信息,获取其一行中m到n字符处的信息:

cut -c m-n filename

**

grep

** cut命令是将一行信息当中取出部分我们想要的,而grep则是分析一行信息,若当中有我们所需要的信息,就将该行拿出来。

简单的语法是这样的:

grep [-acinv] '查找字符' filename

选项参数为: -a 将二进制文件以文本文件的方式查找数据 -c 计算找到’查找字符’的次数 -i忽略大小写 -n输出行号 -v反向选择

假设我们要提取出一个fasta序列文件中的标题行:

grep '>' fasta.faa

那再顺道统计一下序列条数吧:

grep '>' fasta.faa | wc

grep还有一些进阶功能:

grep [-A] [-B] '查找字符' filename

选项参数: -A after的意思,指除了该行外还再列出该行后多少行 -B before的意思,指除了该行外还再列出该行前多少行

假设我们要查询文件中一个名为“xueba”的蛋白序列,忽略大小写更靠谱:

grep -A 30 -i 'xueba' filename

grep是支持正则表达式的,可以方便我们对数据进行搜索,不知道python的正则表达式与linux中是不是一样的,下次好好看看再写写吧。

**

sed

** sed可以对数据进行替换、删除、新增选取特定行等功能,相当有用。

基本语法:

sed [-nefri] [m[,n]] [acdips] filename

选项参数: -n:安静模式,加上n后只有被处理的行才会输出到屏幕上 -e:直接在命令行模式上进行sed的操作 -f:直接将sed的操作写在一个文件内, -f filename 则可以执行filename内的sed操作 -r: sed操作使用的是扩展型正则表达式语法 -i:直接修改读取文件的内容,而不是由屏幕输出

[m[,n]]:待操作行,m到n行,非必须参数

功能参数: a:新增,a后面接字符,这些字符会在当前行的下一行出现 c:替换,c后面接字符,这些字符会替换n1到n2行的内容 d:删除 i:插入,i后面接字符,这些字符会在当前行的上一行出现 p:打印,将某个选择的数据打印出来,常与sed -n一起用 s:替换,可以直接进行替换工作,可以搭配正则表达式,是我们最常用的功能

看例子: sed行处理 (1)删除第n到最后一行:

sed 'n,$d' filename

(2)在第n行后增加‘xueba’

sed 'na xueba' filename

(3)在第n行后增加’xueba’和’daxueba’两行:

sed 'na xueba \ daxueba' filename

(4)将m到n行替换为’xueba’:

sed 'm,nc xueba' filename

(5)取出第m到n行:

sed -n 'm,np' filename

sed替换功能 常用语法:

sed 's/要被替换的字符/新的字符/g' filename

(1)将’xueba’替换为’daxueba’:

sed 's/xueba/daxueba/g' filename

(2)删除文件中的注释行和空白行:

sed 's/#.*$//g' | sed '/^$/d' filename

(3)直接对文件进行替换更改,加-i参数

sed -i 's/xueba/daxueba/g' filename

**

awk

** sed常常用于一整个行的处理,awk则倾向于将一行分成数个字段处理,awk更适合处理小型数据。

回头补上这段… …

############################################################

回到正题来,现在我有几十个G序列文件,内容如下所示,我想给每个序列的>后加上文件名,形成>filename_gene_…的格式:

>gene_3|GeneMark.hmm IGYAQEPIEISAGKRGSETYIYIYIYIYIYIYIHRWAEPAKIDMKAHTGVGGVSA >gene_4|GeneMark.hmm WRDFILPRLDLEKMIDEQTGLPFSREKLELAFTDSHERIRTDGMVDLDPGKASGSKALAN RNQDHRFFVFKDADSWMEYMARDIAMMEVLGPNPDLTIRFL

使用循环来对所有文件执行替换:

for file in `ls $1` do eval sed -i 's/gene_/${file%.*}_gene_/' $file done

修改后的结果:

>aaa_gene_3|GeneMark.hmm IGYAQEPIEISAGKRGSETYIYIYIYIYIYIYIHRWAEPAKIDMKAHTGVGGVSA >aaa_gene_4|GeneMark.hmm WRDFILPRLDLEKMIDEQTGLPFSREKLELAFTDSHERIRTDGMVDLDPGKASGSKALAN RNQDHRFFVFKDADSWMEYMARDIAMMEVLGPNPDLTIRFL

注意!

(1)使用[for file in `ls $1`]对当前目录下所有文件执行遍历,[`ls $1`]两旁使用的不是单引号,是英文输入法状态下键盘tab键上面的那个 ` 字符。

(2)eval会扫描两次要执行的操作,先识别其中的变量${file}内容后再执行操作。也可以不使用eval,而使用"s/gene_/${file%.*}gene/",双引号将语句括起来。

(3)若是产生"sed:-e 表达式 #1,字符 11:“s”的未知选项"的报错的话,说明我们的变量名中含有与sed操作’s/gene_/${file}gene/'相同的符号,这时候可以使用#替换/,或者使用!也可以!

(4)如果文件名是aaa.txt,最后怎么去掉.txt呢?使用${file%.*},它表示删除右边算起第一个.右边的内容.txt,只保留左边aaa。

这里使用${}来对变量的进行提取和替换等操作,它可以以任意字符作为处理的'flag',和#与%一起使用,来达到我们想要的结果:

其中: #:表示从左边算起第一个 %:表示从右边算起第一个 ##:表示从左边算起最后一个 %%:表示从右边算起最后一个 即:#总是表示左边算(删除左边的),%总是表示右边算(删除右边的)。

*:表示要删除的内容

.表示用来分隔的字符,可以是任意字符:字母,数字,符号都可以

${var##a*}表示删除变量var从左边算起最后一个字符a及其左边的字符。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3